package com.zp.self.module.level_4_算法练习.数据结构.hash表;

import java.util.HashMap;
import java.util.Map;

/**
 * @author By ZengPeng
 */
public class 力扣_219_存在重复元素II {
    //测试
    public static void main(String[] args) {
        System.out.println(new 力扣_219_存在重复元素II().containsNearbyDuplicate(new int[]{1,2,3,1},3));
        System.out.println(new 力扣_219_存在重复元素II().containsNearbyDuplicate(new int[]{1,0,1,1},1));
        System.out.println(new 力扣_219_存在重复元素II().containsNearbyDuplicate(new int[]{1,2,3,1,2,3},2));
        System.out.println(new 力扣_219_存在重复元素II().containsNearbyDuplicate(new int[]{99,99},2));
    }

    /**
     * 题目：给你一个整数数组 nums 和一个整数 k ，判断数组中是否存在两个 不同的索引 i 和 j ，
     * 满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在，返回 true ；否则，返回 false 。
     *
     *
     * 分析：
     *      1.简单点 遍历判断
     *      2.简单点 Hash存储.  时间:O(n) ,空间:O(n);
     *
     * 边界值注意：
     *      {1,2,3,1},3
     *      {99，99} 2   ？？？？/  1-2  2-1   ==2？？？
     *      卧槽看错题了，不大于k啊
     **/
    //2.简单点 Hash存储.  时间:O(n) ,空间:O(n);
    //存 <值,下标> 下标有多个？？  不用考虑多个 ，因为后续的会将前面的替换掉，后面的离后面的更近，绝对值更接近k
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        int index = nums.length-1;
        for (int i = 0; i <= index; i++) {
            if(map.containsKey(nums[i]) && (i-map.get(nums[i]))<=k) return  true;
            else  map.put(nums[i],i);
        }
        return  false;
    }
}
